www.gusucode.com > VC 类似360界面的互粉程序源码-源码程序 > VC 类似360界面的互粉程序源码-源码程序/code/SkinBtn.cpp

    //Download by http://www.NewXing.com
/************************************************************************ 
* 文件名:    SkinBtn.cpp 
* 文件描述:  图片按钮 
* 创建人:    黄锐坤(Nuk), 2006年08月22日
* 版本号:    1.0 
************************************************************************/ 
// SkinBtn.cpp : 实现文件
//
/************************************************************************ 
* 修改人:    张延锋(Nuk), 2007年10月20日
* 版本号:    2.0 
修改原因:VC6.0没CImage类,要从VC7.0移植到6.0
修改SetImage(CString strNormal, CString strHover, CString strDown, CString strDisable)及其它SetImage多态性相关FUN
修改DrawButton();
新增SetIcon(int iConIn,int iConOut)
************************************************************************/ 
#include "stdafx.h"
#include "SkinBtn.h"

#define   WM_BUTTON_FIRST_SELECT  (WM_USER + 103)
// CSkinBtn
#ifndef	BTNST_AUTO_GRAY
#define	BTNST_AUTO_GRAY					(HICON)(0xffffffff - 1L)
#endif
IMPLEMENT_DYNAMIC(CSkinBtn, CButton)

CSkinBtn::CSkinBtn()
{
	m_ShowState = 0;
	m_pFont = NULL;
	m_state = NORMAL;
	m_pFont=new CFont();
	m_pFont->CreatePointFont(90,_T("Arial"));
	m_fg = RGB(0, 0, 0);
	m_bg = RGB(255, 255, 255);
	m_bMouseOver = false;
	m_bEnabled = true;
	m_bDCStored = false;
	m_textPos = CPoint(21,0);
	m_iconRect = CRect(0,0,16,16);
	m_strTextOut = _T("");
	m_IconDraw = FALSE;
	m_IconIn = NULL;
	m_IconOut= NULL;
	m_SendTime = 0;
	m_bDrawRantage = FALSE;
    m_bDrawScroll = BUTTON_DEFAULT;
	m_bRePain = FALSE;
	m_BtnNum = -1;
//	m_ColorR = 0;
//	m_ColorG = 0;
//	m_ColorB = 0;
	
}

CSkinBtn::~CSkinBtn()
{
	if(m_pFont)
	  delete m_pFont;
	m_memDC.DeleteDC();
	m_imgNormal.DeleteObject();
	m_imgHover.DeleteObject();
	m_imgDown.DeleteObject();
	m_imgDisable.DeleteObject();
	m_imgScroll.DeleteObject();
}


BEGIN_MESSAGE_MAP(CSkinBtn, CButton)
	ON_WM_MOUSEMOVE()
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	ON_WM_SETCURSOR()
	ON_WM_ENABLE()
END_MESSAGE_MAP()



void CSkinBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{

	//// TODO:  添加您的代码以绘制指定项
	//CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	UINT state = lpDIS->itemState; 
	//CRect rect;
	//rect.CopyRect(&lpDIS->rcItem); 

	m_state = NORMAL;

	if (state & ODS_FOCUS)
	{
		if (state & ODS_SELECTED)
		{ 
			m_state = DOWN;
		}
		else
		{
			if(m_bMouseOver)
				m_state = HOVER;
		}
	}
	else
	{
		m_state = NORMAL;
	}
	if (state & ODS_DISABLED)
	{
		m_state = DISABLE;
		m_bEnabled = false;
	}
    switch(m_bDrawScroll)
	{
	case BUTTON_SCROLL:
		DrawButtonScroll();
		break;
	case BUTTON_TITLE:
		DrawButtonTitle();
		break;
	case BUTTON_NOPICTURE:
		DrawButtonNullPicture();
		break;
	default:
		DrawButton();
		break;
	}
   
	   
}


void CSkinBtn::DrawButtonTitle()
{
	if(m_bRePain == FALSE)
	{
		CClientDC  dc(this);

		CRect	rect;
		GetClientRect(&rect);

		CDC memDC;
		memDC.CreateCompatibleDC(&dc);

		CBitmap Screen;
		Screen.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
		memDC.SelectObject(&Screen);
		Screen.DeleteObject();


		//画背景 
		memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY);

	//	CString str(_T(""));
	//	GetWindowText(str);	

		memDC.SetBkMode(TRANSPARENT);
		memDC.SelectObject(m_pFont);

	//	CDC MemDC;
	//	MemDC.CreateCompatibleDC(&dc);

       
        CPen pen;
		
	//	CRgb textColor(255,255,255);
        
		switch(m_state)
		{
		case NORMAL:
			memDC.SetTextColor(RGB(97,113,197));
			pen.CreatePen(PS_SOLID , 1, RGB(255,0,0));
			break;
		case HOVER:
			memDC.SetTextColor(RGB(36,93,219));
			pen.CreatePen(PS_SOLID , 1, RGB(0,255,0));
			break;
		case DOWN:
			memDC.SetTextColor(GetBGColor());
			pen.CreatePen(PS_SOLID , 1, RGB(0,0,255));
			break;
		case DISABLE:
			memDC.SetTextColor(GetFGColor());
			pen.CreatePen(PS_SOLID , 1, RGB(225,225,225));
			break;
		default:
			break;
		}
        CPen* pOldPen = (CPen*)memDC.SelectObject(&pen);
		memDC.RoundRect(rect.left, rect.top, rect.Width(), rect.Height(),2,2);
		memDC.SelectObject(pOldPen);

		CPen pen0(PS_SOLID , 1, RGB(255, 255, 255));
		CPen* pOldPen0 = (CPen*)memDC.SelectObject(&pen);
		int nXpos = 0;
		int nYpos = 0;
		int n = 0;
		int m = 0;
		int nWidth = 0;
		int nHeight = 0;
		switch(m_BtnNum)
		{
			case 1://最小化
				
				nWidth = 13;
				nXpos = rect.left + 1;
		        nYpos = rect.top +  (nWidth/2 );
                for( n = nXpos + 3;n < nXpos + nWidth;n++)
				{
					//memDC.MoveTo(nXpos + nWidth/2 - 1,nYpos - 1);
					//memDC.LineTo(nXpos + nWidth/2+ 1 ,nYpos - 1);
					memDC.MoveTo(n,nXpos + 6);
		         	memDC.LineTo(n ,nXpos + 2 + 6);
					nYpos--;

				}
				break;
				
			case 2://还原
				nWidth = 7;
				nHeight = 7;
				nXpos = rect.left + 5;
		        nYpos = rect.top + 5;
				for(m = 0;m < 2;m++)
				{
					memDC.MoveTo(nXpos,nYpos);
					memDC.LineTo(nXpos + nWidth ,nYpos);

					memDC.MoveTo(nXpos,nYpos);
					memDC.LineTo(nXpos ,nYpos + nHeight);

					memDC.MoveTo(nXpos + nWidth,nYpos + nHeight);
					memDC.LineTo(nXpos ,nYpos + nHeight);

					memDC.MoveTo(nXpos + nWidth,nYpos + nHeight);
					memDC.LineTo(nXpos + nWidth ,nYpos);
					nXpos+=2;
					nYpos+=2;
				}
				break;
			case 3://关闭
				nWidth = 10;
				nXpos = rect.left + 4;
		        nYpos = rect.top + (nWidth - 1) + 4;
				for(n = nXpos;n < nXpos + 10;n++)
				{
					memDC.MoveTo(n,n);
					memDC.LineTo(n + 3,n);

					memDC.MoveTo(n,nYpos);
					memDC.LineTo(n + 3,nYpos);
					nYpos--;

				}
				break;
			case 4://下三角按妞
				nWidth = 9;
				nXpos = rect.left;
		        nYpos = rect.top ;
				for(m = 0;m < 5;m++)
				{
					memDC.MoveTo(nXpos + m + 3,nYpos + m + 3);
			        memDC.LineTo(nXpos + nWidth - m + 3  ,nYpos + m + 3);
				}
				break;
			case 5://加号按妞
		    	nWidth = 14;
				nXpos = rect.left + 1;
		        nYpos = rect.top +  (nWidth/2 );
                for( n = nXpos + 3;n < nXpos + nWidth;n++)
				{
					//memDC.MoveTo(nXpos + nWidth/2 - 1,nYpos - 1);
					//memDC.LineTo(nXpos + nWidth/2+ 1 ,nYpos - 1);
					memDC.MoveTo(n,nXpos + 6);
		         	memDC.LineTo(n ,nXpos + 2 + 6);

					memDC.MoveTo(nXpos + nWidth/2 - 1 + 1,nYpos - 1 + 7);
		            memDC.LineTo(nXpos + nWidth/2 + 1 + 1,nYpos - 1 + 7);
					nYpos--;

				}
				break;
			case 6://画下划线按妞
				memDC.SetBkColor(TRANSPARENT);
				nXpos = rect.left ;
		        nYpos = rect.top +5;
                memDC.TextOut(23,nYpos,m_strTextOut);
		        
				break;
			default:
				break;
		}
        memDC.SelectObject(pOldPen0);
		dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
		memDC.DeleteDC();
		//MemDC.DeleteDC();
	}
}
/*
void CSkinBtn::SetRGBColor(int R,int G,int B)//设置背景三个色调
{
//	m_ColorR = R;
//	m_ColorG = G;
//	m_ColorB = B;
}*/

void CSkinBtn::DrawButtonNullPicture()
{
	if(m_bRePain == FALSE)
	{
		CPoint posText(0,0);
		CClientDC  dc(this);

		CRect	rect;
		GetClientRect(&rect);

		

		CDC memDC;
		memDC.CreateCompatibleDC(&dc);

		CBitmap Screen;
		Screen.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
		memDC.SelectObject(&Screen);
		Screen.DeleteObject();

		//画背景 
		memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY);

		CString str(_T(""));
		GetWindowText(str);	

		int nLen = str.GetLength();
		if(nLen > 3)
		  posText.x = (rect.Width())/5;
		else
          posText.x = (rect.Width())/3;
		if(posText.x < 0)
           posText.x = 0;
		posText.y = (rect.Height() - 20)/2;
        if(posText.y < 0)
           posText.y = 0;

		memDC.SetBkMode(TRANSPARENT);
		memDC.SelectObject(m_pFont);
        
		CDC MemDC;
		MemDC.CreateCompatibleDC(&dc);
		switch(m_state)
			{
			case NORMAL:
				memDC.SetTextColor(GetBGColor());
				break;
			case HOVER:
				if(m_bDrawRantage)
				{
					memDC.SetTextColor(RGB(36,93,219));
					memDC.MoveTo(rect.left,rect.top);
					memDC.LineTo(rect.right,rect.top);
					memDC.MoveTo(rect.left,rect.top);
					memDC.LineTo(rect.left,rect.bottom);
					memDC.MoveTo(rect.left,rect.bottom - 1);
					memDC.LineTo(rect.right,rect.bottom - 1);
					memDC.MoveTo(rect.right - 1,rect.top);
					memDC.LineTo(rect.right - 1,rect.bottom);
				}
				break;
			case DOWN:				
				memDC.SetTextColor(GetBGColor());
				break;
			case DISABLE:
				 memDC.SetTextColor(GetFGColor());
	//			 memDC.TextOut(m_textPos.x,m_textPos.y,str);
				break;
			default:
				break;
			}

		    if(!str.IsEmpty())
			{
				memDC.TextOut(posText.x,posText.y,str);
			}
			dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

			memDC.DeleteDC();
			MemDC.DeleteDC();
		}
		
}

void CSkinBtn::DrawButtonScroll()
{
	if(m_bRePain == FALSE)
	{
		CClientDC  dc(this);

		CRect	rect;
		GetClientRect(&rect);

		CDC memDC;
		memDC.CreateCompatibleDC(&dc);

		CBitmap Screen;
		Screen.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
		memDC.SelectObject(&Screen);
		Screen.DeleteObject();

		//画背景 
		memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY);

		CString str(_T(""));
		GetWindowText(str);	

		memDC.SetBkMode(TRANSPARENT);
		memDC.SelectObject(m_pFont);

		CDC MemDC;
		MemDC.CreateCompatibleDC(&dc);
		int nX,nY,nW,nH;
        switch(m_BtnNum)
		{
			case 1://UP
				nX = 0;
				nY = 0;
				nW = 15;
				nH = 14;
				break;
			case 2:
				nX = 18;
				nY = 0;
				nW = 15;
				nH = 14;
				break;
			case 3:
				nX = 36;
				nY = 0;
				nW = 15;
				nH = 15;
				break;
			default:
				break;
		}

		switch(m_state)
		{
		case NORMAL:
			MemDC.SelectObject(&m_imgScroll);
		/*	if(m_BtnNum == 3)
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY,nW,
				nH,SRCCOPY);
			else*/
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY,nW,
				nH,SRCCOPY);
			break;
		case HOVER:
			MemDC.SelectObject(&m_imgScroll);
	/*		if(m_BtnNum == 3)
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY + 18,nW,
				nH,SRCCOPY);
			else*/
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY + 18,nW,
				nH,SRCCOPY);
			break;
		case DOWN:
			SetTimer(2,20,NULL);
			MemDC.SelectObject(&m_imgScroll);
	/*		if(m_BtnNum == 3)
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY + 36,nW,
				nH,SRCCOPY);
			else*/
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY + 36,nW,
				nH,SRCCOPY);
			break;
		case DISABLE:
			MemDC.SelectObject(&m_imgScroll);
	/*		if(m_BtnNum == 3)
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY,nW,
				nH,SRCCOPY);
			else*/
			    memDC.StretchBlt(0,0,nW,nH,&MemDC,nX,nY,nW,
				nH,SRCCOPY);
			break;
		default:
			break;
		}
   //     if(m_BtnNum == 3)
			    dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
//		else
//		        dc.StretchBlt(rect.left, rect.top, nW, nH, &memDC, 0, 0,nW,nH, SRCCOPY);
		memDC.DeleteDC();
		MemDC.DeleteDC();
	}
}


void CSkinBtn::DrawButton()
{

	CPoint posText(0,0);
	if(m_bRePain == FALSE)
	{
		CClientDC  dc(this);

		CRect	rect;
		GetClientRect(&rect);

		CDC memDC;
		memDC.CreateCompatibleDC(&dc);

		CBitmap Screen;
		Screen.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
		memDC.SelectObject(&Screen);
		Screen.DeleteObject();

		//画背景 
		memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY);

		CString str(_T(""));
		GetWindowText(str);	

		memDC.SetBkMode(TRANSPARENT);
		memDC.SelectObject(m_pFont);

		CDC MemDC;
		MemDC.CreateCompatibleDC(&dc);
		BITMAP bm;

		if(m_IconDraw)
		{
			CRect rImage;
			rImage.top = 0;
			rImage.left = 0;
			
			BOOL		bRetValue;
			ICONINFO	ii;
			::ZeroMemory(&ii, sizeof(ICONINFO));
			bRetValue = ::GetIconInfo(m_IconIn, &ii);
			if (bRetValue == FALSE)
			{
				if (m_IconIn)	::DestroyIcon(m_IconIn);
				rImage.bottom = 16;
	     		rImage.right = 16;
			} 
			else
			{
				rImage.right	= (DWORD)(ii.xHotspot * 2);
				rImage.bottom	= (DWORD)(ii.yHotspot * 2);
			}
			::DeleteObject(ii.hbmMask);
			::DeleteObject(ii.hbmColor);
			//int nXOffset = (rect.Width() - rImage.right)/2;
			int nYOffset = (rect.Height() - rImage.bottom)/2;//rect.Width(), rect.Height()
			if(nYOffset < 0)
				nYOffset = 0;
			rImage.top += nYOffset;
			posText.x = rImage.right + 2;
			posText.y = (rect.Height() - 20)/2;
            if(posText.y < 0)
               posText.y = 0;


			switch(m_state)
			{
			case NORMAL:
				// Ole'!
				memDC.DrawState(rImage.TopLeft(),
								rImage.Size(), 
								m_IconIn,
								DSS_NORMAL, 
								(CBrush*)NULL);
				memDC.SetTextColor(GetFGColor());
	//			memDC.TextOut(m_textPos.x,m_textPos.y,str);
				break;
			case HOVER:
				// Ole'!
				memDC.DrawState(rImage.TopLeft(),
								rImage.Size(), 
								m_IconOut,
								DSS_NORMAL, 
								(CBrush*)NULL);	
				memDC.SetTextColor(RGB(36,93,219));
	//			memDC.TextOut(m_textPos.x,m_textPos.y,str);
				if(m_bDrawRantage)
				{
					memDC.MoveTo(rect.left,rect.top);
					memDC.LineTo(rect.right,rect.top);
					memDC.MoveTo(rect.left,rect.top);
					memDC.LineTo(rect.left,rect.bottom);
					memDC.MoveTo(rect.left,rect.bottom - 1);
					memDC.LineTo(rect.right,rect.bottom - 1);
					memDC.MoveTo(rect.right - 1,rect.top);
					memDC.LineTo(rect.right - 1,rect.bottom);
				}
			//	memDC.SetBkColor(TRANSPARENT);
			//	memDC.Rectangle(rect);
				break;
			case DOWN:
				// Ole'!
//				SetTimer(2,20,NULL);
				memDC.DrawState(rImage.TopLeft(),
								rImage.Size(), 
								m_IconOut,
								DSS_NORMAL, 
								(CBrush*)NULL);	
				memDC.SetTextColor(GetBGColor());
	//			memDC.TextOut(m_textPos.x,m_textPos.y,str);
				break;
			case DISABLE:
				memDC.DrawState(rImage.TopLeft(),
								rImage.Size(), 
								m_IconIn,
								DSS_NORMAL, 
								(CBrush*)NULL);
				memDC.SetTextColor(GetFGColor());
	//			memDC.TextOut(m_textPos.x,m_textPos.y,str);
				break;
			default:
				break;
			}
		}
		else
		{
			CString ss;
			GetWindowText(ss);
			m_imgNormal.GetBitmap(&bm);
			int nYOffset = (rect.Height() - bm.bmHeight)/2;//rect.Width(), rect.Height()
			if(nYOffset < 0)
				nYOffset = 0;

			posText.x = rect.left + bm.bmWidth + 2;
			posText.y = (rect.Height() - 20)/2;
            if(posText.y < 0)
               posText.y = 0;

			posText = m_textPos;
			if(m_ShowState == 1)
			{//强制设成选取中状态
				m_imgDown.GetBitmap(&bm);
//				SetTimer(2,20,NULL);
				MemDC.SelectObject(&m_imgDown);
				if(bm.bmHeight>rect.bottom || bm.bmWidth>rect.right)
					memDC.StretchBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,bm.bmWidth,
					bm.bmHeight,SRCCOPY);
				else
					memDC.BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);
				memDC.SetTextColor(GetBGColor());

			}
			else
			{
				switch(m_state)
				{
				case NORMAL:
					m_imgNormal.GetBitmap(&bm);
					MemDC.SelectObject(&m_imgNormal);
					if(bm.bmHeight>rect.bottom || bm.bmWidth>rect.right)
						memDC.StretchBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,bm.bmWidth,
						bm.bmHeight,SRCCOPY);
					else
						memDC.BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);
					memDC.SetTextColor(GetFGColor());
		//			memDC.TextOut(m_textPos.x,m_textPos.y,str);
					break;
				case HOVER:
					m_imgHover.GetBitmap(&bm);
					MemDC.SelectObject(&m_imgHover);
					if(bm.bmHeight>rect.bottom || bm.bmWidth>rect.right)
						memDC.StretchBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,bm.bmWidth,
						bm.bmHeight,SRCCOPY);
					else
						memDC.BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);
					if(m_bDrawRantage)
					{
						memDC.SetTextColor(GetBGColor());
						memDC.TextOut(m_textPos.x,m_textPos.y,str);
						memDC.MoveTo(rect.left,rect.top);
						memDC.LineTo(rect.right,rect.top);
						memDC.MoveTo(rect.left,rect.top);
						memDC.LineTo(rect.left,rect.bottom);
						memDC.MoveTo(rect.left,rect.bottom - 1);
						memDC.LineTo(rect.right,rect.bottom - 1);
						memDC.MoveTo(rect.right - 1,rect.top);
						memDC.LineTo(rect.right - 1,rect.bottom);
					}
					break;
				case DOWN:
					m_imgDown.GetBitmap(&bm);
	//				SetTimer(2,20,NULL);
					MemDC.SelectObject(&m_imgDown);
					if(bm.bmHeight>rect.bottom || bm.bmWidth>rect.right)
						memDC.StretchBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,bm.bmWidth,
						bm.bmHeight,SRCCOPY);
					else
						memDC.BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);
					memDC.SetTextColor(GetBGColor());
		//			memDC.TextOut(m_textPos.x,m_textPos.y,str);
					break;
				case DISABLE:
					 m_imgDisable.GetBitmap(&bm);
	   				 MemDC.SelectObject(&m_imgDisable);
					 if(bm.bmHeight>rect.bottom || bm.bmWidth>rect.right)
		 				 memDC.StretchBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,bm.bmWidth,
						 bm.bmHeight,SRCCOPY);
					 else
						 memDC.BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);
					 memDC.SetTextColor(GetFGColor());
		//			 memDC.TextOut(m_textPos.x,m_textPos.y,str);
					break;
				default:
					break;
				}
			}
		}
		if(!str.IsEmpty())
		{
			memDC.TextOut(posText.x,posText.y,str);
		}
		dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

		memDC.DeleteDC();
		MemDC.DeleteDC();
	}
}

void CSkinBtn::DrawFilledRect(CDC *DC, CRect R, COLORREF color)
{ 
	CBrush B;
	B.CreateSolidBrush(color);
	DC->FillRect(R, &B);
}

void CSkinBtn::DrawButtonText(CDC *DC, CRect R, CString str, COLORREF TextColor)
{
  /*  COLORREF prevColor = DC->SetTextColor(TextColor);
	DC->SetBkMode(TRANSPARENT);
	DC->SelectObject(m_pFont);
/*	if(m_hMouseOutIcon.IsNull()&&m_hMouseInIcon.IsNull())
	{
		//int iconwidth=::GetSystemMetrics(SM_CXICON);
		R.right=R.right-m_textPos.x;
		DC->DrawText( str, str.GetLength(), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	}
	else
	{
		DC->DrawText( str, str.GetLength(), R, DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
	}*/
//	str = _T("MyText");
/*	DC->DrawText( str, str.GetLength(), R, DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
	DC->SetTextColor(prevColor);*/
}
void CSkinBtn::SetParentWnd(HWND hWnd)
{
	m_ParentWnd = hWnd;
	SetTimer(101,1000,NULL);
}
void CSkinBtn::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//if (nFlags & MK_LBUTTON && m_bMouseOver == FALSE) 
	//	return;
	if(!m_bMouseOver&&m_bEnabled)
	{
		m_bMouseOver=true;
		m_state = HOVER;

		CPoint	point;
		CRect	rect;
		GetWindowRect(&rect);	
		GetCursorPos(&point);
		if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled)
		{
			SetTimer(1,10,NULL);
			return;
		}

		switch(m_bDrawScroll)
		{
		case BUTTON_SCROLL:
			DrawButtonScroll();
			break;
		case BUTTON_TITLE:
			DrawButtonTitle();
			break;
		case BUTTON_NOPICTURE:
			DrawButtonNullPicture();
			break;
		default:
			DrawButton();
			break;
		}
		
		SetTimer(1,10,NULL);
	}
	CButton::OnMouseMove(nFlags, point);
}

void CSkinBtn::SetRantageDraw(BOOL bDraw)
{
	m_bDrawRantage = bDraw;
}


void CSkinBtn::SetScrollDraw(int bDraw ,int nNum)
{
	HBITMAP szhBitmapNormal;
	szhBitmapNormal=HBITMAP(::LoadImage(AfxGetInstanceHandle(),_T("Image\\FolderScrollbar.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
	m_imgScroll.Attach(szhBitmapNormal);
	m_bDrawScroll = bDraw;
	m_BtnNum = nNum;
}

void CSkinBtn::SetMovePain(BOOL bDraw)
{
    m_bRePain = bDraw;
}

BOOL CSkinBtn::MoveWndBegin(fListMoveWnd lpfListMoveWnd,LPARAM lPARAM)
{
	if(m_state == DOWN)
	{
		CPoint	point;
		CRect	rect;
		GetWindowRect(&rect);	
		GetCursorPos(&point);
		m_SendTime++;
		lpfListMoveWnd(point,m_SendTime,lPARAM);
	}
	return TRUE;
}

void CSkinBtn::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CPoint	point;
	CRect	rect;
	GetWindowRect(&rect);	
	GetCursorPos(&point);
	switch(nIDEvent)
	{
	case(1):
		{
			if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled)
			{
				KillTimer (1);
				m_bMouseOver=false;
				m_state = NORMAL;
				switch(m_bDrawScroll)
				{
				case BUTTON_SCROLL:
					DrawButtonScroll();
					break;
				case BUTTON_TITLE:
					DrawButtonTitle();
					break;
				case BUTTON_NOPICTURE:
					DrawButtonNullPicture();
					break;
				default:
					DrawButton();
					break;
				}
			}
		}
		break;
	case(2):
		{
			//发送消息给PARENT窗口
			m_SendTime++;
			if(m_SendTime == 1)
			{
               ::SendMessage(m_ParentWnd,WM_BUTTON_FIRST_SELECT,point.x,point.y);
//               ::SendMessage(m_ParentWnd,WM_BUTTON_SELECT,point.x,point.y);
			}
			
		}
		break;
	case(101):
		this->Invalidate(FALSE);
		break;
	default:
		break;
	}	
	if(m_state!=DOWN)
	{
		KillTimer (2);
		m_SendTime = 0;
//		::SendMessage(m_ParentWnd,WM_BUTTON_FIRST_SELECT,NULL,m_SendTime);
		
	}
	CButton::OnTimer(nIDEvent);
}

void CSkinBtn::PreSubclassWindow()
{
	// TODO: 在此添加专用代码和/或调用基类
	SetOwnerDraw(true);

//	CButton::PreSubclassWindow();
}
void CSkinBtn::SetButtonText(CString str)
{
	m_strTextOut = str;
	SetWindowText(m_strTextOut);
}
void CSkinBtn::SetOwnerDraw(bool IsDraw)
{
	if(m_bRePain == FALSE)
	{
		if(IsDraw)
		{
			ModifyStyle(NULL, BS_OWNERDRAW); 
			Invalidate(FALSE);
		}
		else
		{
			ModifyStyle(BS_OWNERDRAW, NULL); 
			Invalidate(FALSE);
		}
	}
}
//IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP1);//_
void CSkinBtn::SetImage(CString strNormal, CString strHover, CString strDown, CString strDisable)
{
	HBITMAP hBitmapNormal,hBitmapHover,hBitmapDown,hBitmapDisable;
	hBitmapNormal=HBITMAP(::LoadImage(AfxGetInstanceHandle(),strNormal,
		IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
	hBitmapHover=HBITMAP(::LoadImage(AfxGetInstanceHandle(),strHover,
		IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
	hBitmapDown=HBITMAP(::LoadImage(AfxGetInstanceHandle(),strDown,
		IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
	hBitmapDisable=HBITMAP(::LoadImage(AfxGetInstanceHandle(),strDisable,
		IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
    this->SetImage(hBitmapNormal,hBitmapHover,hBitmapDown,hBitmapDisable);
}

void CSkinBtn::SetImage(HBITMAP nNormalID, HBITMAP nHoverID, HBITMAP nDownID, HBITMAP nDisableID)
{
	if(nNormalID==NULL)
		return;
	m_imgNormal.Attach(nNormalID);
	if(nHoverID==NULL)
		return;
	m_imgHover.Attach(nHoverID);
	if(nDownID==NULL)
		return;
	m_imgDown.Attach(nDownID);
	if(nDisableID==NULL)
		return;
	m_imgDisable.Attach(nDisableID);
}

void CSkinBtn::SetIcons(int nIconIn, int nIconOut,BOOL bDrawIcon)
{
	HICON		hIconIn			= NULL;
	HICON		hIconOut		= NULL;
	HINSTANCE	hInstResource	= NULL;

	// Find correct resource handle
	hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconIn), RT_GROUP_ICON);

	// Set icon when the mouse is IN the button
	hIconIn = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconIn), IMAGE_ICON, 0, 0, 0);
  	// Set icon when the mouse is OUT the button
	if (nIconOut)
	{
		if (nIconOut == (int)BTNST_AUTO_GRAY)
			hIconOut = BTNST_AUTO_GRAY;
		else
			hIconOut = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconOut), IMAGE_ICON, 0, 0, 0);
	} // if

	m_IconIn = hIconIn;
    m_IconOut = hIconOut;
	m_IconDraw = bDrawIcon;
}
void CSkinBtn::SetImage(UINT nNormalID, UINT nHoverID, UINT nDownID, UINT nDisableID)
{
	m_imgNormal.LoadBitmap(nNormalID);
	m_imgHover.LoadBitmap(nHoverID);
	m_imgDown.LoadBitmap(nDownID);
	m_imgDisable.LoadBitmap(nNormalID);

}

BOOL CSkinBtn::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(m_bRePain == FALSE)
	{
		if(!m_bDCStored)
		{
    		CRect  rect;
			GetClientRect(&rect);

			m_memDC.CreateCompatibleDC (pDC);
			CBitmap	btScreen;
			btScreen.CreateCompatibleBitmap (pDC,rect.Width(),rect.Height());
			m_memDC.SelectObject (&btScreen);

			m_memDC.BitBlt (0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);

			m_bDCStored=true;

			CRgn rgn;
			rgn.CreateRectRgn (0, 0, rect.Width(), rect.Height());
			SetWindowRgn (rgn, TRUE);

			btScreen.DeleteObject();
		}
	}
	return TRUE;// CButton::OnEraseBkgnd(pDC);//
}

BOOL CSkinBtn::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
//	::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND)); 
	return TRUE;
//	return CButton::OnSetCursor(pWnd, nHitTest, message);
}

void CSkinBtn::SetIcons(CString  strMouseOut,CString strMouseIn,BOOL bDrawIcon)
{
//	m_hMouseOutIcon.Load(strMouseOut);
//	m_hMouseInIcon.Load(strMouseIn);
	HICON		hIconIn			= NULL;
	HICON		hIconOut		= NULL;
	HINSTANCE	hInstResource	= NULL;

	// Find correct resource handle
	hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(hIconIn), RT_GROUP_ICON);

	// Set icon when the mouse is IN the button
	hIconIn = (HICON)::LoadImage(hInstResource, strMouseIn, IMAGE_ICON, 0, 0, 0);

  	// Set icon when the mouse is OUT the button
	if (strMouseOut)
	{
	//	if (hIconOut == (int)BTNST_AUTO_GRAY)
	//		hIconOut = BTNST_AUTO_GRAY;
	//	else
			hIconOut = (HICON)::LoadImage(hInstResource, strMouseOut, IMAGE_ICON, 0, 0, 0);
	} // if

	m_IconIn = hIconIn;
    m_IconOut = hIconOut;
	m_IconDraw = bDrawIcon;
}

void CSkinBtn::SetColor(COLORREF fgcolor,COLORREF bgcolor)
{
	m_fg = fgcolor;
	m_bg = bgcolor;
	switch(m_bDrawScroll)
	{
	case BUTTON_SCROLL:
		DrawButtonScroll();
		break;
	case BUTTON_TITLE:
		DrawButtonTitle();
		break;
	case BUTTON_NOPICTURE:
		DrawButtonNullPicture();
		break;
	default:
		DrawButton();
		break;
	}
}

void CSkinBtn::SetTextPos(CPoint point)
{
	m_textPos = point;
}
CRect CSkinBtn::GetRectInParent()
{
	CRect rcWindowParent;
	GetParent()->GetWindowRect(rcWindowParent);//client
	CRect rcWindow;
	GetWindowRect(&rcWindow);
	CRect rect;
	rect.left = rcWindow.left-rcWindowParent.left;
	rect.top = rcWindow.top-rcWindowParent.top;
	rect.right = rcWindow.right-rcWindowParent.left;
	rect.bottom = rcWindow.bottom-rcWindowParent.top;

	return rect;
}
void CSkinBtn::OnEnable(BOOL bEnable)
{
	CButton::OnEnable(bEnable);

	// TODO: 在此处添加消息处理程序代码
	if(bEnable)
		m_bEnabled = true;
	else
		m_bEnabled = false;
}